🎖️GitЯра🎖️
Node / meshtastic / Meshtastic-Android / files / feature / car / src / main / kotlin / org / meshtastic / feature / car / service / ConversationShortcutManager.kt
Displaying Raw • Download
feature/car/src/main/kotlin/org/meshtastic/feature/car/service/ConversationShortcutManager.kt 578dd1ca1bf2b7477fef326b900ab3263bb859b2 (578dd1ca) Text, 8.61 KB
T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.feature.car.service
Tff7b72import T7ee787android.content.Context
Tff7b72import T7ee787android.content.Intent
Tff7b72import T7ee787android.content.pm.ShortcutInfo
Tff7b72import T7ee787androidx.core.app.Person
Tff7b72import T7ee787androidx.core.content.LocusIdCompat
Tff7b72import T7ee787androidx.core.content.pm.ShortcutInfoCompat
Tff7b72import T7ee787androidx.core.content.pm.ShortcutManagerCompat
Tff7b72import T7ee787androidx.core.net.toUri
Tff7b72import T7ee787co.touchlab.kermit.Logger
Tff7b72import T7ee787kotlinx.coroutines.CoroutineScope
Tff7b72import T7ee787kotlinx.coroutines.Job
Tff7b72import T7ee787kotlinx.coroutines.flow.combine
Tff7b72import T7ee787kotlinx.coroutines.flow.distinctUntilChanged
Tff7b72import T7ee787kotlinx.coroutines.flow.map
Tff7b72import T7ee787kotlinx.coroutines.launch
Tff7b72import T7ee787org.koin.core.annotation.Single
Tff7b72import T7ee787org.meshtastic.core.model.DataPacket
Tff7b72import T7ee787org.meshtastic.core.model.nodeColorsFromNum
Tff7b72import T7ee787org.meshtastic.core.repository.NodeRepository
Tff7b72import T7ee787org.meshtastic.core.repository.PacketRepository
Tff7b72import T7ee787org.meshtastic.core.repository.RadioConfigRepository
Tff7b72import T7ee787org.meshtastic.feature.car.util.PersonIconFactory
T8b949e/**
* Publishes dynamic shortcuts for active DM conversations and channels so that Android Auto can surface Meshtastic
* conversations as messaging destinations and link notifications to template conversations via [LocusIdCompat].
*/
Tf0883e@Single
Tff7b72class T56d364ConversationShortcutManagerTb4b4b4(
Tff7b72private Tff7b72val Te6edf3contextTb4b4b4: Te6edf3ContextTb4b4b4,
Tff7b72private Tff7b72val Te6edf3nodeRepositoryTb4b4b4: Te6edf3NodeRepositoryTb4b4b4,
Tff7b72private Tff7b72val Te6edf3packetRepositoryTb4b4b4: Te6edf3PacketRepositoryTb4b4b4,
Tff7b72private Tff7b72val Te6edf3radioConfigRepositoryTb4b4b4: Te6edf3RadioConfigRepositoryTb4b4b4,
Tb4b4b4) Tb4b4b4{
Tff7b72private Tff7b72var Te6edf3observeJobTb4b4b4: Te6edf3Job? Tff7b72= Tff7b72null
Tff7b72fun Td2a8ffstartObservingTb4b4b4(Te6edf3scopeTb4b4b4: Te6edf3CoroutineScopeTb4b4b4) Tb4b4b4{
Te6edf3observeJobTff7b72?.Te6edf3cancelTb4b4b4(Tb4b4b4)
Te6edf3observeJob Tff7b72=
Te6edf3scopeTb4b4b4.Te6edf3launch Tb4b4b4{
Tff7b72val Te6edf3dmContactsFlow Tff7b72=
Te6edf3packetRepository
Tb4b4b4.Te6edf3getContactsTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3map Tb4b4b4{ Te6edf3contacts Tff7b72-Tff7b72>
T8b949e// DM contacts are those whose key does NOT contain the broadcast ID
Te6edf3contactsTb4b4b4.Te6edf3entries
Tb4b4b4.Te6edf3filter Tb4b4b4{ Tb4b4b4(Te6edf3keyTb4b4b4, Te6edf3_Tb4b4b4) Tff7b72-Tff7b72> Tff7b72!Te6edf3keyTb4b4b4.Te6edf3containsTb4b4b4(Te6edf3DataPacketTb4b4b4.Te6edf3ID_BROADCASTTb4b4b4) Tb4b4b4}
Tb4b4b4.Te6edf3sortedByDescending Tb4b4b4{ Tb4b4b4(Te6edf3_Tb4b4b4, Te6edf3packetTb4b4b4) Tff7b72-Tff7b72> Te6edf3packetTb4b4b4.Te6edf3time Tb4b4b4}
Tb4b4b4.Te6edf3map Tb4b4b4{ Tb4b4b4(Te6edf3keyTb4b4b4, Te6edf3packetTb4b4b4) Tff7b72-Tff7b72> Te6edf3DmContactTb4b4b4(Te6edf3keyTb4b4b4, Te6edf3packetTb4b4b4.Te6edf3fromTb4b4b4.Te6edf3orEmptyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3packetTb4b4b4.Te6edf3timeTb4b4b4) Tb4b4b4}
Tb4b4b4}
Tb4b4b4.Te6edf3distinctUntilChangedTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3channelsFlow Tff7b72=
Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3channelSetFlow
Tb4b4b4.Te6edf3map Tb4b4b4{ Te6edf3channelSet Tff7b72-Tff7b72>
Te6edf3channelSetTb4b4b4.Te6edf3settingsTb4b4b4.Te6edf3mapIndexedNotNull Tb4b4b4{ Te6edf3indexTb4b4b4, Te6edf3settings Tff7b72-Tff7b72>
Tff7b72if Tb4b4b4(Te6edf3index Tff7b72=Tff7b72= T79c0ff0 Tff7b72|Tff7b72| Te6edf3settingsTb4b4b4.Te6edf3nameTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3index Te6edf3to Te6edf3settingsTb4b4b4.Te6edf3name
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72null
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4.Te6edf3distinctUntilChangedTb4b4b4(Tb4b4b4)
Te6edf3combineTb4b4b4(Te6edf3dmContactsFlowTb4b4b4, Te6edf3channelsFlowTb4b4b4) Tb4b4b4{ Te6edf3dmsTb4b4b4, Te6edf3channels Tff7b72-Tff7b72> Te6edf3dms Te6edf3to Te6edf3channels Tb4b4b4}
Tb4b4b4.Te6edf3collect Tb4b4b4{ Tb4b4b4(Te6edf3dmsTb4b4b4, Te6edf3channelsTb4b4b4) Tff7b72-Tff7b72> Te6edf3publishShortcutsTb4b4b4(Te6edf3dmsTb4b4b4, Te6edf3channelsTb4b4b4) Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tff7b72fun Td2a8ffstopObservingTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3observeJobTff7b72?.Te6edf3cancelTb4b4b4(Tb4b4b4)
Te6edf3observeJob Tff7b72= Tff7b72null
Tb4b4b4}
Tff7b72private Tff7b72fun Td2a8ffpublishShortcutsTb4b4b4(Te6edf3dmContactsTb4b4b4: Te6edf3ListTff7b72<Te6edf3DmContactTff7b72>Tb4b4b4, Te6edf3channelsTb4b4b4: Te6edf3ListTff7b72<Te6edf3PairTff7b72<Tffa657IntTb4b4b4, Tffa657StringTff7b72>Tff7b72>Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3shortcuts Tff7b72=
Te6edf3dmContactsTb4b4b4.Te6edf3mapNotNull Tb4b4b4{ Te6edf3buildDmShortcutTb4b4b4(Tffa657itTb4b4b4) Tb4b4b4} Tff7b72+
Te6edf3channelsTb4b4b4.Te6edf3map Tb4b4b4{ Tb4b4b4(Te6edf3indexTb4b4b4, Te6edf3nameTb4b4b4) Tff7b72-Tff7b72> Te6edf3buildChannelShortcutTb4b4b4(Te6edf3indexTb4b4b4, Te6edf3nameTb4b4b4) Tb4b4b4}
Tff7b72try Tb4b4b4{
Tff7b72val Te6edf3limit Tff7b72= Te6edf3ShortcutManagerCompatTb4b4b4.Te6edf3getMaxShortcutCountPerActivityTb4b4b4(Te6edf3contextTb4b4b4)
Tff7b72val Te6edf3currentKeys Tff7b72= Te6edf3shortcutsTb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3id Tb4b4b4}Tb4b4b4.Te6edf3toSetTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3stale Tff7b72= Te6edf3ShortcutManagerCompatTb4b4b4.Te6edf3getDynamicShortcutsTb4b4b4(Te6edf3contextTb4b4b4)Tb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3id Tb4b4b4}Tb4b4b4.Te6edf3filter Tb4b4b4{ Tffa657it Tff7b72!in Te6edf3currentKeys Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3staleTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3ShortcutManagerCompatTb4b4b4.Te6edf3removeDynamicShortcutsTb4b4b4(Te6edf3contextTb4b4b4, Te6edf3staleTb4b4b4)
Tb4b4b4}
Tff7b72for Tb4b4b4(Te6edf3shortcut Tff7b72in Te6edf3shortcutsTb4b4b4.Te6edf3takeTb4b4b4(Te6edf3limitTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3ShortcutManagerCompatTb4b4b4.Te6edf3pushDynamicShortcutTb4b4b4(Te6edf3contextTb4b4b4, Te6edf3shortcutTb4b4b4)
Tb4b4b4}
Te6edf3LoggerTb4b4b4.Te6edf3dTb4b4b4(Te6edf3tag Tff7b72= Te6edf3TAGTb4b4b4) Tb4b4b4{ Ta5d6ff"Ta5d6ffPublished Tffd700${Te6edf3shortcutsTb4b4b4.Te6edf3sizeTb4b4b4.Te6edf3coerceAtMostTb4b4b4(Te6edf3limitTb4b4b4)Tffd700}Ta5d6ff conversation shortcutsTa5d6ff" Tb4b4b4}
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4: Te6edf3IllegalArgumentExceptionTb4b4b4) Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3eTb4b4b4(Te6edf3tag Tff7b72= Te6edf3TAGTb4b4b4, Te6edf3throwable Tff7b72= Te6edf3eTb4b4b4) Tb4b4b4{ Ta5d6ff"Ta5d6ffFailed to publish conversation shortcutsTa5d6ff" Tb4b4b4}
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4: Te6edf3IllegalStateExceptionTb4b4b4) Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3eTb4b4b4(Te6edf3tag Tff7b72= Te6edf3TAGTb4b4b4, Te6edf3throwable Tff7b72= Te6edf3eTb4b4b4) Tb4b4b4{ Ta5d6ff"Ta5d6ffFailed to publish conversation shortcutsTa5d6ff" Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tff7b72private Tff7b72fun Td2a8ffbuildDmShortcutTb4b4b4(Te6edf3dmTb4b4b4: Te6edf3DmContactTb4b4b4)Tb4b4b4: Te6edf3ShortcutInfoCompat? Tb4b4b4{
Tff7b72val Te6edf3node Tff7b72= Te6edf3nodeRepositoryTb4b4b4.Te6edf3nodeDBbyNumTb4b4b4.Te6edf3valueTb4b4b4.Te6edf3valuesTb4b4b4.Te6edf3find Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3userTb4b4b4.Te6edf3id Tff7b72=Tff7b72= Te6edf3dmTb4b4b4.Te6edf3userId Tb4b4b4}
Tff7b72val Te6edf3label Tff7b72= Te6edf3nodeTff7b72?.Te6edf3userTff7b72?.Te6edf3long_nameTff7b72?.Te6edf3ifEmpty Tb4b4b4{ Te6edf3nodeTb4b4b4.Te6edf3userTb4b4b4.Te6edf3short_name Tb4b4b4} Tff7b72?: Te6edf3dmTb4b4b4.Te6edf3contactKey
Tff7b72val Te6edf3personBuilder Tff7b72= Te6edf3PersonTb4b4b4.Te6edf3BuilderTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3setNameTb4b4b4(Te6edf3labelTb4b4b4)Tb4b4b4.Te6edf3setKeyTb4b4b4(Te6edf3dmTb4b4b4.Te6edf3contactKeyTb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3node Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72val Tb4b4b4(Te6edf3foregroundColorTb4b4b4, Te6edf3backgroundColorTb4b4b4) Tff7b72= Te6edf3nodeColorsFromNumTb4b4b4(Te6edf3nodeTb4b4b4.Te6edf3numTb4b4b4)
Te6edf3personBuilderTb4b4b4.Te6edf3setIconTb4b4b4(Te6edf3PersonIconFactoryTb4b4b4.Te6edf3createTb4b4b4(Te6edf3nodeTb4b4b4.Te6edf3userTb4b4b4.Te6edf3short_nameTb4b4b4, Te6edf3backgroundColorTb4b4b4, Te6edf3foregroundColorTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tff7b72val Te6edf3person Tff7b72= Te6edf3personBuilderTb4b4b4.Te6edf3buildTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3ShortcutInfoCompatTb4b4b4.Te6edf3BuilderTb4b4b4(Te6edf3contextTb4b4b4, Te6edf3dmTb4b4b4.Te6edf3contactKeyTb4b4b4)
Tb4b4b4.Te6edf3setShortLabelTb4b4b4(Te6edf3labelTb4b4b4)
Tb4b4b4.Te6edf3setLongLabelTb4b4b4(Te6edf3labelTb4b4b4)
Tb4b4b4.Te6edf3setLocusIdTb4b4b4(Te6edf3LocusIdCompatTb4b4b4(Te6edf3dmTb4b4b4.Te6edf3contactKeyTb4b4b4)Tb4b4b4)
Tb4b4b4.Te6edf3setPersonTb4b4b4(Te6edf3personTb4b4b4)
Tb4b4b4.Te6edf3setLongLivedTb4b4b4(Tff7b72trueTb4b4b4)
Tb4b4b4.Te6edf3setCategoriesTb4b4b4(Te6edf3setOfTb4b4b4(Te6edf3ShortcutInfoTb4b4b4.Te6edf3SHORTCUT_CATEGORY_CONVERSATIONTb4b4b4)Tb4b4b4)
Tb4b4b4.Te6edf3setIntentTb4b4b4(Te6edf3conversationIntentTb4b4b4(Te6edf3dmTb4b4b4.Te6edf3contactKeyTb4b4b4)Tb4b4b4)
Tb4b4b4.Te6edf3buildTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tff7b72private Tff7b72fun Td2a8ffbuildChannelShortcutTb4b4b4(Te6edf3indexTb4b4b4: Tffa657IntTb4b4b4, Te6edf3nameTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Te6edf3ShortcutInfoCompat Tb4b4b4{
Tff7b72val Te6edf3contactKey Tff7b72= Ta5d6ff"Tffd700${Te6edf3indexTffd700}Tffd700${Te6edf3DataPacketTb4b4b4.Te6edf3ID_BROADCASTTffd700}Ta5d6ff"
Tff7b72val Te6edf3channelName Tff7b72= Te6edf3nameTb4b4b4.Te6edf3ifEmpty Tb4b4b4{ Ta5d6ff"Ta5d6ffPrimary ChannelTa5d6ff" Tb4b4b4}
Tff7b72val Te6edf3person Tff7b72= Te6edf3PersonTb4b4b4.Te6edf3BuilderTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3setNameTb4b4b4(Te6edf3channelNameTb4b4b4)Tb4b4b4.Te6edf3setKeyTb4b4b4(Ta5d6ff"Ta5d6ffchannel-Tffd700$Te6edf3indexTa5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3buildTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3ShortcutInfoCompatTb4b4b4.Te6edf3BuilderTb4b4b4(Te6edf3contextTb4b4b4, Te6edf3contactKeyTb4b4b4)
Tb4b4b4.Te6edf3setShortLabelTb4b4b4(Te6edf3channelNameTb4b4b4)
Tb4b4b4.Te6edf3setLongLabelTb4b4b4(Te6edf3channelNameTb4b4b4)
Tb4b4b4.Te6edf3setLocusIdTb4b4b4(Te6edf3LocusIdCompatTb4b4b4(Te6edf3contactKeyTb4b4b4)Tb4b4b4)
Tb4b4b4.Te6edf3setPersonTb4b4b4(Te6edf3personTb4b4b4)
Tb4b4b4.Te6edf3setLongLivedTb4b4b4(Tff7b72trueTb4b4b4)
Tb4b4b4.Te6edf3setCategoriesTb4b4b4(Te6edf3setOfTb4b4b4(Te6edf3ShortcutInfoTb4b4b4.Te6edf3SHORTCUT_CATEGORY_CONVERSATIONTb4b4b4)Tb4b4b4)
Tb4b4b4.Te6edf3setIntentTb4b4b4(Te6edf3conversationIntentTb4b4b4(Te6edf3contactKeyTb4b4b4)Tb4b4b4)
Tb4b4b4.Te6edf3buildTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tff7b72private Tff7b72fun Td2a8ffconversationIntentTb4b4b4(Te6edf3contactKeyTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Te6edf3Intent Tff7b72=
Te6edf3IntentTb4b4b4(Te6edf3IntentTb4b4b4.Te6edf3ACTION_VIEWTb4b4b4, Ta5d6ff"Ta5d6ffmeshtastic://messages/Tffd700$Te6edf3contactKeyTa5d6ff"Tb4b4b4.Te6edf3toUriTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{
Te6edf3setPackageTb4b4b4(Te6edf3contextTb4b4b4.Te6edf3packageNameTb4b4b4)
Tb4b4b4}
T8b949e/**
* Ensures a long-lived conversation shortcut exists for [contactKey]. Called on demand when a notification is about
* to reference a shortcut ID that may not have been pre-published.
*/
Tff7b72fun Td2a8ffensureConversationShortcutTb4b4b4(Te6edf3contactKeyTb4b4b4: Tffa657StringTb4b4b4, Te6edf3displayNameTb4b4b4: Tffa657StringTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3alreadyPublished Tff7b72= Te6edf3ShortcutManagerCompatTb4b4b4.Te6edf3getDynamicShortcutsTb4b4b4(Te6edf3contextTb4b4b4)Tb4b4b4.Te6edf3any Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3id Tff7b72=Tff7b72= Te6edf3contactKey Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3alreadyPublishedTb4b4b4) Tff7b72return
Tff7b72val Te6edf3person Tff7b72= Te6edf3PersonTb4b4b4.Te6edf3BuilderTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3setNameTb4b4b4(Te6edf3displayNameTb4b4b4)Tb4b4b4.Te6edf3setKeyTb4b4b4(Te6edf3contactKeyTb4b4b4)Tb4b4b4.Te6edf3buildTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3shortcut Tff7b72=
Te6edf3ShortcutInfoCompatTb4b4b4.Te6edf3BuilderTb4b4b4(Te6edf3contextTb4b4b4, Te6edf3contactKeyTb4b4b4)
Tb4b4b4.Te6edf3setShortLabelTb4b4b4(Te6edf3displayNameTb4b4b4)
Tb4b4b4.Te6edf3setLongLabelTb4b4b4(Te6edf3displayNameTb4b4b4)
Tb4b4b4.Te6edf3setLocusIdTb4b4b4(Te6edf3LocusIdCompatTb4b4b4(Te6edf3contactKeyTb4b4b4)Tb4b4b4)
Tb4b4b4.Te6edf3setPersonTb4b4b4(Te6edf3personTb4b4b4)
Tb4b4b4.Te6edf3setLongLivedTb4b4b4(Tff7b72trueTb4b4b4)
Tb4b4b4.Te6edf3setCategoriesTb4b4b4(Te6edf3setOfTb4b4b4(Te6edf3ShortcutInfoTb4b4b4.Te6edf3SHORTCUT_CATEGORY_CONVERSATIONTb4b4b4)Tb4b4b4)
Tb4b4b4.Te6edf3setIntentTb4b4b4(Te6edf3conversationIntentTb4b4b4(Te6edf3contactKeyTb4b4b4)Tb4b4b4)
Tb4b4b4.Te6edf3buildTb4b4b4(Tb4b4b4)
Tff7b72try Tb4b4b4{
Te6edf3ShortcutManagerCompatTb4b4b4.Te6edf3pushDynamicShortcutTb4b4b4(Te6edf3contextTb4b4b4, Te6edf3shortcutTb4b4b4)
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4: Te6edf3IllegalArgumentExceptionTb4b4b4) Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3eTb4b4b4(Te6edf3tag Tff7b72= Te6edf3TAGTb4b4b4, Te6edf3throwable Tff7b72= Te6edf3eTb4b4b4) Tb4b4b4{ Ta5d6ff"Ta5d6ffFailed to publish on-demand shortcut Tffd700$Te6edf3contactKeyTa5d6ff" Tb4b4b4}
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4: Te6edf3IllegalStateExceptionTb4b4b4) Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3eTb4b4b4(Te6edf3tag Tff7b72= Te6edf3TAGTb4b4b4, Te6edf3throwable Tff7b72= Te6edf3eTb4b4b4) Tb4b4b4{ Ta5d6ff"Ta5d6ffFailed to publish on-demand shortcut Tffd700$Te6edf3contactKeyTa5d6ff" Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tff7b72private Tff7b72data Tff7b72class T56d364DmContactTb4b4b4(Tff7b72val Te6edf3contactKeyTb4b4b4: Tffa657StringTb4b4b4, Tff7b72val Te6edf3userIdTb4b4b4: Tffa657StringTb4b4b4, Tff7b72val Te6edf3lastMessageTimeTb4b4b4: Tffa657LongTb4b4b4)
Tff7b72companion Tff7b72object Tb4b4b4{
Tff7b72private Tff7b72const Tff7b72val Te6edf3TAG Tff7b72= Ta5d6ff"Ta5d6ffConversationShortcutsTa5d6ff"
Tb4b4b4}
Tb4b4b4}
Served by rngit 1.5.2 - Generated in 0.09s